home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 151-175 / scopedisk157 / dsize / dsize.c < prev    next >
C/C++ Source or Header  |  1995-03-19  |  7KB  |  231 lines

  1. /*
  2.   DSIZE by Gregg A. Reno  Downingtown, Pa
  3.  
  4.   Almost all of this code was borrowed from the program TREE by
  5.   David A. Dette
  6.  
  7.   This command is designed to get an AmigaDOS directory and
  8.   display it and its sub-directories to the screen.  It will also display
  9.   the disk space used by each directory, including all of the files and 
  10.   directories below it.
  11.  
  12.   The output may be redirected to the printer by using the
  13.   standard cli redirection system but the redirection must follow the
  14.   command and preceed any directory or column options.
  15.  
  16.   Syntax:    DSIZE <directory> <-max_levels>
  17.  
  18.     where
  19.         directory = a AmigaDOS directory or device name
  20.         max_leves = the maximum levels of the tree to display.
  21.                 For example, -1 will just display the directory
  22.             specified.  -2 will display the directory specified
  23.             and any directories below it.  No matter what level
  24.             number you specify, it will still look at all files
  25.             in all of the subdirectories.
  26.             
  27. */
  28.  
  29. #include <exec/types.h>
  30. #include <stdio.h>
  31. #include <ctype.h>
  32. #include <exec/memory.h>
  33. #include <libraries/dos.h>
  34.  
  35. int max_levels,printdir();
  36. void output();
  37.  
  38. struct LINK {
  39.     struct LINK *next;
  40.     char str[120];
  41.     };
  42.  
  43. /* Forground and background colors for each level */
  44. char fg[21] = {31,33,31,33,31,33,31,33,31,33,31,33,31,33,31,33,31,33,31,33,31};
  45.  
  46. struct LINK *curlink, *lastlink;
  47.  
  48. char *spaces = "                                                                       ";
  49. char tstring[128],tstring2[128];
  50.  
  51. main(argc,argv)
  52. int argc;
  53. char *argv[];
  54. {
  55.     char *dirname;             /* Pointer to Starting AmigaDOS directory */
  56.     int size;
  57.     max_levels = 99;
  58.     curlink = lastlink = 0;    /* Linked list pointers */
  59.     switch (argc)
  60.     {
  61.        case 1 :
  62.           dirname = "";     /* No Directory Specified start with current */
  63.           break;
  64.        case 2 :
  65.           if (argv[1][0] == '?')
  66.           {
  67.              printf("Usage: DSIZE [dirname] {-max levels}\n");
  68.              printf("Programmed by: Gregg Reno\n");
  69.              Exit();
  70.           }
  71.           else if (argv[1][0] == '-')
  72.           {
  73.              max_levels = atoi(argv[1]+1);
  74.              dirname = "";
  75.           }
  76.           else
  77.              dirname = argv[1];
  78.           break;
  79.        case 3 :
  80.           if (argv[2][0] == '-')
  81.           {
  82.              max_levels = atoi(argv[2]+1);
  83.              dirname = argv[1];
  84.           }
  85.           else if (argv[1][0] == '-')
  86.           {
  87.              max_levels = atoi(argv[1]+1);
  88.              dirname = argv[2];
  89.           }
  90.           else
  91.              dirname = argv[1];
  92.           break;
  93.        default :
  94.           printf("Usage: Tree [dirname] {-max levels}\n");
  95.           printf("Programmed by: David A. Dette\n");
  96.           printf("               Wichita, Kansas\n");
  97.           Exit();
  98.     }
  99.     size = printdir(dirname,0);
  100.  
  101.     while (lastlink != 0)
  102.     {
  103.     printf("%s",lastlink->str);
  104.     curlink = lastlink->next;
  105.         FreeMem(lastlink, sizeof(struct LINK));
  106.         lastlink = curlink;
  107.     }
  108.     
  109. /*    printf("Grand total for %s: %d\n",size);*/
  110. }
  111.  
  112. int printdir(dirname,level)
  113. char *dirname;
  114. int level;            /* Current subdirectory level */
  115. {
  116.     char *adddir();
  117.     char *subdir[50];          /* Pointer area for Sub-Directories */
  118.     char pathname[400];        /* Pointers to AmigaDOS sub-directories */
  119.     struct FileLock *dir;      /* Locked AmigaDOS directory */
  120.     struct FileInfoBlock *fb;  /* File Info from locked directory */
  121.     UBYTE count;               /* Line length count */
  122.     UBYTE countdir,indexdir;   /* Pending Directories */
  123.     long IoErr();              /* Error in file access */
  124.     void *AllocMem();
  125.     struct FileLock *Lock();
  126.     int size,fsize;
  127.  
  128.     countdir = indexdir = 0;   /* Zero Directory Entry Counters */
  129.     size = fsize = 0;           /* Size of directory in blocks */
  130.  
  131.     fb = (struct FileInfoBlock *) AllocMem(sizeof(struct FileInfoBlock),
  132.           MEMF_CLEAR | MEMF_PUBLIC);
  133.     if ((dir = Lock(dirname,ACCESS_READ)) == NULL)
  134.     {
  135.         printf("Invalid directory '%s' requested\n",dirname);
  136.         Exit();
  137.     }
  138.  
  139.     if (!Examine(dir,fb) || (fb->fib_DirEntryType <= 0))
  140.     {
  141.        printf("Invalid directory '%s' requested\n",dirname);
  142.        UnLock(dir);
  143.        FreeMem(fb,sizeof(struct FileInfoBlock));
  144.        Exit();
  145.     }
  146.  
  147.     count = 0;
  148.     while (ExNext(dir,fb))
  149.     {
  150.        if (fb->fib_DirEntryType > 0)
  151.        {
  152.           subdir[countdir++] = adddir(fb->fib_FileName);
  153.        }
  154.        else
  155.       {
  156.           /* printf("%-19s",fb->fib_FileName); */
  157.       size += fb->fib_NumBlocks;
  158.           fsize += fb->fib_NumBlocks;
  159.       }
  160.        count++;
  161.     }
  162.     UnLock(dir);
  163.     FreeMem(fb,sizeof(struct FileInfoBlock));
  164.     
  165.     while (indexdir < countdir)
  166.     {
  167.        strcpy(pathname,dirname);
  168.        if ((dirname[strlen(dirname)-1] != ':') &&
  169.            (dirname[strlen(dirname)-1] != '/') && (strlen(dirname) > 0))
  170.           strcat(pathname,"/");
  171.        strcat(pathname,subdir[indexdir]);
  172.        size += printdir(pathname,level + 1);
  173.        FreeMem(subdir[indexdir],strlen(subdir[indexdir])+1);
  174.        indexdir++;
  175.     }
  176.     if (fsize != 0 && countdir != 0 & (level+1) < max_levels )
  177.     output("(FILES)",fsize,level+1);
  178.     if (level < max_levels) output(dirname,size,level);
  179.     return (size);
  180. }
  181.  
  182. void output( dir, blocks, levno)
  183.     char *dir;
  184.     int blocks, levno;
  185.     {
  186.     int i,len;
  187.     double f;
  188.  
  189.     /* Strip off all but last directory name */
  190.     len = strlen(dir);
  191.     for (i = len; dir[i] != ':' && dir[i] != '/' && i >= 0; --i);
  192.     if (i > 0 && i != len-1)
  193.     strcpy(tstring, &dir[i+1]);
  194.     else
  195.     strcpy(tstring,dir);
  196.  
  197.     i = levno * 3;        /* Number of spaces to indent */
  198.     f = blocks / 2048.0;        /* 2048 blocks per meg */
  199.     spaces[i] = 0;
  200.     sprintf(tstring2,"\033[0;%dm%s%-12s %6d blocks, %3.2lf meg\033[0m\n",
  201.     fg[levno],spaces,tstring, blocks, f);
  202.     spaces[i] = ' ';
  203.  
  204.     /* Add this string to the linked list */
  205.     len = strlen(tstring2);
  206.     if (len > 78) tstring[79] = 0;
  207.     curlink = AllocMem(sizeof(struct LINK),MEMF_CLEAR | MEMF_PUBLIC);
  208.     if (curlink == NULL)
  209.        {
  210.        printf("Not Enough Memory for output line\n");
  211.        return;
  212.        }
  213.     strcpy(curlink->str, tstring2);
  214.     curlink->next = lastlink;
  215.     lastlink = curlink;
  216.     }
  217.  
  218. char *adddir(dirname)
  219. char *dirname;
  220. {
  221.     char *nameadd;    /* Address of the directory name */
  222.  
  223.     nameadd = AllocMem(strlen(dirname)+1,MEMF_CLEAR | MEMF_PUBLIC);
  224.     if (nameadd == NULL)
  225.        {
  226.        printf("Not Enough Memory for Directories!!!\n");
  227.        Exit();
  228.        }
  229.     return((char *)strcpy(nameadd,dirname));
  230. }
  231.